package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * java反射机制
 * 反射机制是java动态机制，他允许程序运行过程中再确定实例化对象，调用方法，操作属性等工作
 * 这使得程序提高了灵活度，可以更好的适应程序运行后的某些多变环节的处理
 * 反射会带来更多的系统消耗和较慢的运行效率，因此程序不能过度依赖反射，只在必要环节使用即可
 */

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {


    /*
        使用反射机制操作一个类，我们需要获取该类的对象，即：Class的一个实例
        JVM中每个被加载的类都由且只有一个类对象，通过类对象我们可以获取其表示的类的
        相关信息，比如：类名，有哪些方法，属性，构造器等

        获取一个类的类对象方式有：
        1：类名.class
        例如：
        Class cls=String.class;获取String的类对象
        Class cls=int.class;获取int的类对象，注：基本类型只能这样获取类对象


        2：Class。forName(String className)
        Class提供了一个静态方法forName，用于加载并获取该类的类对象，传入的时要获取类的
        类名，这里必须是完全限定名，格式：包名.类名
        例如：
        Class cls = Class.forName("java.lang.String");

        3:使用类加载器ClassLoader获取
     */

        //Class cls = String.class;
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类名:");
        String className = scanner.nextLine();
        /*
            java.lang.String
            java.io.FileInputStream
            reflect.Person
            java.util.HashSet

         */
        Class cls = Class.forName(className);
        String name = cls.getName();
        System.out.println(name);
        name = cls.getSimpleName();
        System.out.println(name);

        Method[] methods = cls.getMethods();
        for (Method m : methods){
            System.out.println(m.getName());
        }

    }
}

